// 完整的Node.js测试运行器 - 集成了TypeScript测试功能
const baseApi = "http://dev.mark.satrace.cn";

// API函数 - 与orgApi.ts保持一致
async function getBalanceNo(params) {
  const response = await fetch(`${baseApi}/api/v2/balance/get_balance_no`, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify(params),
  });

  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }

  const data = await response.json();
  return data;
}

async function getTime() {
  const response = await fetch(`${baseApi}/api/v2/balance/get_time`, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
  });

  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }

  const data = await response.json();
  return data;
}

async function loadKey(params) {
  // 模拟paramsTransition处理（简化版本，不依赖balanceBaseUtils）
  const processedParams = {
    ...params,
    key: 'test-key',
    timestamp: Date.now(),
    sign: Date.now().toString()
  };

  const response = await fetch(`${baseApi}/api/v2/balance/load_key`, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify(processedParams),
  });

  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }

  const data = await response.json();
  return data;
}

/**
 * 测试 getBalanceNo API
 */
async function testGetBalanceNo() {
  console.log('🚀 开始测试 getBalanceNo API...\n');

  try {
    // 测试参数
    const testParams = {
      uniqueCode: 'aOjKfGK0bc4DAK5SV0eFUqs8'
    };

    console.log('📤 发送请求参数:', JSON.stringify(testParams, null, 2));
    console.log('⏳ 请求中...\n');

    // 发送请求
    const startTime = Date.now();
    const result = await getBalanceNo(testParams);
    const endTime = Date.now();

    // 打印结果
    console.log('✅ 请求成功!');
    console.log(`⏱️  耗时: ${endTime - startTime}ms`);
    console.log('📥 响应结果:');
    console.log(JSON.stringify(result, null, 2));

  } catch (error) {
    console.error('❌ 请求失败:');
    console.error('错误信息:', error.message);
    if (error.cause) {
      console.error('原因:', error.cause);
    }
  }
}

/**
 * 测试 getTime API
 */
async function testGetTime() {
  console.log('🕐 开始测试 getTime API...\n');

  try {
    console.log('⏳ 请求服务器时间中...\n');

    const startTime = Date.now();
    const result = await getTime();
    const endTime = Date.now();

    console.log('✅ 请求成功!');
    console.log(`⏱️  耗时: ${endTime - startTime}ms`);
    console.log('📥 响应结果:');
    console.log(JSON.stringify(result, null, 2));

  } catch (error) {
    console.error('❌ 请求失败:');
    console.error('错误信息:', error.message);
    if (error.cause) {
      console.error('原因:', error.cause);
    }
  }
}

/**
 * 测试 loadKey API - 先获取 balance_no，再调用 loadKey
 */
async function testLoadKey() {
  console.log('🔑 开始测试 loadKey API (集成流程)...\n');

  try {
    // 第一步：获取 balance_no
    console.log('📋 步骤 1: 先获取 balance_no');
    const getBalanceParams = {
      uniqueCode: 'aOjKfGK0bc4DAK5SV0eFUqs8'
    };

    console.log('📤 getBalanceNo 请求参数:', JSON.stringify(getBalanceParams, null, 2));
    console.log('⏳ 获取 balance_no 中...\n');

    const balanceResult = await getBalanceNo(getBalanceParams);

    if (balanceResult.res !== 1 || !balanceResult.data || !balanceResult.data.balance_no) {
      throw new Error('获取 balance_no 失败: ' + balanceResult.msg);
    }

    const { balance_no, config_id, oid } = balanceResult.data;
    console.log('✅ 成功获取到设备信息:');
    console.log(`   balance_no: ${balance_no}`);
    console.log(`   config_id: ${config_id}`);
    console.log(`   oid: ${oid}\n`);

    // 第二步：使用获取到的参数调用 loadKey
    console.log('📋 步骤 2: 使用获取到的参数调用 loadKey');
    const loadKeyParams = {
      balance_no: balance_no,
      config_id: config_id,
      oid: oid
    };

    console.log('📤 loadKey 请求参数:', JSON.stringify(loadKeyParams, null, 2));
    console.log('⏳ 加载密钥中...\n');

    const startTime = Date.now();
    const result = await loadKey(loadKeyParams);
    const endTime = Date.now();

    console.log('✅ loadKey 请求成功!');
    console.log(`⏱️  耗时: ${endTime - startTime}ms`);
    console.log('📥 响应结果:');
    console.log(JSON.stringify(result, null, 2));

  } catch (error) {
    console.error('❌ 请求失败:');
    console.error('错误信息:', error.message);
    if (error.cause) {
      console.error('原因:', error.cause);
    }
  }
}

/**
 * 集成测试：完整的 getBalanceNo -> loadKey 流程
 */
async function testIntegratedFlow() {
  console.log('🔗 开始集成测试：getBalanceNo -> loadKey 完整流程\n');

  try {
    // 测试不同的 uniqueCode
    const testCodes = [
      'aOjKfGK0bc4DAK5SV0eFUqs8',
      'aOjLFYyKKAcDAPngwyTqYGh8'
    ];

    for (let i = 0; i < testCodes.length; i++) {
      const uniqueCode = testCodes[i];
      console.log(`🔄 测试流程 ${i + 1}: uniqueCode = ${uniqueCode}`);
      console.log('='.repeat(50));

      // 步骤1：获取设备信息
      console.log('📋 步骤 1: 获取设备信息');
      const balanceResult = await getBalanceNo({ uniqueCode });

      if (balanceResult.res === 1 && balanceResult.data) {
        const { balance_no, config_id, oid } = balanceResult.data;
        console.log('✅ 设备信息获取成功:');
        console.log(`   balance_no: ${balance_no}`);
        console.log(`   config_id: ${config_id}`);
        console.log(`   oid: ${oid}`);

        // 步骤2：使用获取到的信息调用 loadKey
        console.log('\n📋 步骤 2: 加载设备密钥');
        const loadKeyResult = await loadKey({
          balance_no,
          config_id,
          oid
        });

        console.log('📥 loadKey 结果:');
        console.log(`   状态: ${loadKeyResult.res === 1 ? '成功' : '失败'}`);
        console.log(`   消息: ${loadKeyResult.msg}`);
        if (loadKeyResult.data) {
          console.log('   数据:', JSON.stringify(loadKeyResult.data, null, 4));
        }

      } else {
        console.log('❌ 设备信息获取失败:', balanceResult.msg);
        console.log('⏭️  跳过 loadKey 步骤');
      }

      console.log('\n' + '='.repeat(50) + '\n');
    }

  } catch (error) {
    console.error('❌ 集成测试失败:');
    console.error('错误信息:', error.message);
  }
}

/**
 * 测试多个不同参数的情况
 */
async function testMultipleScenarios() {
  console.log('\n🔄 开始多场景测试...\n');

  const testCases = [
    { uniqueCode: 'aOjKfGK0bc4DAK5SV0eFUqs8' },
    { uniqueCode: 'aOjLFYyKKAcDAPngwyTqYGh8' },
    { uniqueCode: '' }, // 空字符串测试
  ];

  for (let i = 0; i < testCases.length; i++) {
    console.log(`📋 测试用例 ${i + 1}:`);
    console.log('参数:', JSON.stringify(testCases[i], null, 2));

    try {
      const result = await getBalanceNo(testCases[i]);
      console.log('✅ 成功:', JSON.stringify(result, null, 2));
    } catch (error) {
      console.log('❌ 失败:', error.message);
    }

    console.log('---\n');
  }
}

/**
 * 主测试函数
 */
async function runTests() {
  console.log('🧪 orgApi 完整测试开始\n');
  console.log('='.repeat(60));

  // 1. getBalanceNo API 测试
  await testGetBalanceNo();
  console.log('\n' + '-'.repeat(40) + '\n');

  // 2. getTime API 测试
  await testGetTime();
  console.log('\n' + '-'.repeat(40) + '\n');

  // 3. loadKey API 测试 (集成流程)
  await testLoadKey();
  console.log('\n' + '-'.repeat(40) + '\n');

  // 4. 集成测试：完整流程
  await testIntegratedFlow();
  console.log('\n' + '-'.repeat(40) + '\n');

  // 5. 多场景测试
  await testMultipleScenarios();

  console.log('='.repeat(60));
  console.log('🏁 所有测试完成');
}

// 如果直接运行此文件，则执行测试
if (require.main === module) {
  runTests().catch(console.error);
}

// 导出所有API函数和测试函数供其他地方使用
module.exports = {
  // API函数
  getBalanceNo,
  getTime,
  loadKey,
  // 测试函数
  testGetBalanceNo,
  testGetTime,
  testLoadKey,
  testIntegratedFlow,
  testMultipleScenarios,
  runTests
};